Testing logic code written for execution on a computing system is a critical step in detecting and exposing potential errors during software development. Most existing techniques mainly focus on testing the sequential execution aspects of a code under test. Such techniques cannot effectively address synchronization coverage which is used to detect potential conflicts that may arise if the concurrent execution of different sections of the code results in an attempt to access the same resource at the same time.
In this context, synchronization refers to the use of a lock mechanism on a resource to prevent two or more code sections from accessing the same resource at the same time. In parallel processing environments, execution of a first code section may result in initiation of a lock on a common resource. In such a case, a second concurrently running code section will be blocked from locking or accessing that resource. As such, the first code section is deemed as blocking the second code section, and the second code section is deemed as being blocked by the first code section.
When code sections in a program code are tested for synchronization coverage, it is desirable to determine the different scenarios under which different code sections are either blocked or blocking. Generally, there is no guaranty that running a synchronization test on the program code multiple times will result in detecting additional code sections that are either blocked or blocking. In other words, multiple test runs, in many instances, do not result in better synchronization coverage.